博客动态
Hi!欢迎来到Jerry Coding!公众号垃圾分类增加学习功能,关注下面的公众号一起来帮助Jerry学习更多垃圾分类知识吧!
微信扫码

扫一扫关注我

More
关于
New
RSS

C# Winform自动升级(二)升级包下载升级

2020年11月29日 Jerry 126 2020年12月23日

上一篇说到Winform的第一部分:XML升级文件解析与版本号校验,这里继续后面的升级文件下载与升级。

1、根据XML升级文件解析出的升级包下载路径下载升级包

/// <summary>
/// 升级包下载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
	WebClient client = new WebClient();
	string url = g_upxml.url;
	richTextBox1.AppendText("\n开始下载升级文件...");

	try
	{
		g_zipname = System.IO.Path.GetFileName(url);
		client.DownloadFile(url, System.Environment.CurrentDirectory + "\\" + g_zipname);
		richTextBox1.AppendText("\n下载升级文件完成!");
	}
	catch (Exception ex)
	{
		richTextBox1.AppendText("\n下载失败,错误" + ex.Message);
	}
}

2、下载完成后,计算下载文件的Md5,与XML升级文件中的Md5进行比较,没问题的话,将升级包解压到临时文件夹。

/// <summary>
/// 解压文件到临时目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
	//解压前先校验文件
	richTextBox1.AppendText("\n开始验证下载文件...");
	string zipname = System.Environment.CurrentDirectory + "\\" + g_zipname;
	//先验证Md5
	FileStream fs = new FileStream(zipname, FileMode.Open);

	// 读取文件的 byte[] 
	byte[] bytes = new byte[fs.Length];
	fs.Read(bytes, 0, bytes.Length);
	fs.Close();
	// 把 byte[] 转换成 Stream 
	Stream stream = new MemoryStream(bytes);

	string md5 = getMd5byStream(stream);

	if (md5 != g_upxml.md5)
	{
		richTextBox1.AppendText("\n下载文件验证失败!Md5不一致!");
		return;
	}

	richTextBox1.AppendText("\n下载文件验证成功!");

	//临时解压路径
	string tmppath = System.Environment.CurrentDirectory + "\\tmp\\";

	richTextBox1.AppendText("\n开始解压升级文件...");

	try
	{
		ZipFile.ExtractToDirectory(zipname, tmppath);
	}
	catch { }

	richTextBox1.AppendText("\n解压升级文件完成!");

}

3、最后一步,将解压后的文件复制到原程序目录即可。

/// <summary>
/// 复制文件及文件夹
/// </summary>
/// <param name="srcPath"></param>
/// <param name="destPath"></param>
private void copyDir(string srcPath, string destPath)
{
	DirectoryInfo dir = new DirectoryInfo(srcPath);
	//获取目录下的文件和子目录
	FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();
	foreach (FileSystemInfo i in fileinfo)
	{
		if (i is DirectoryInfo)
		{
			//判断是否文件夹
			if (!Directory.Exists(destPath + "\\" + i.Name))
			{
				//目标目录下不存在此文件夹即创建子文件夹
				Directory.CreateDirectory(destPath + "\\" + i.Name);
			}
			//递归调用复制子文件夹
			copyDir(i.FullName, destPath + "\\" + i.Name);    
		}
		else
		{
			//不是文件夹即复制文件,true表示可以覆盖同名文件
			File.Copy(i.FullName, destPath + "\\" + i.Name, true);      
		}

	}
}

/// <summary>
/// 替换文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button6_Click(object sender, EventArgs e)
{
	//临时解压路径
	string tmppath = System.Environment.CurrentDirectory + "\\tmp";
	string dstpath = System.Environment.CurrentDirectory;

	richTextBox1.AppendText("\n开始升级(复制)文件...");

	copyDir(tmppath, dstpath);

	richTextBox1.AppendText("\n升级完成!");

	richTextBox1.AppendText("\n清理升级文件中...!");

	DirectoryInfo di = new DirectoryInfo(tmppath);
    di.Delete(true);
	
	File.Delete(dstpath + "\\" + g_zipname);
	File.Delete(dstpath + "\\" + g_upxmlname);
	richTextBox1.AppendText("\n清理完成!");
}
}

最终实现的效果:

源码下载: https://github.com/DreamerLS1994/autoupdater


原创文章,转载请注明出处: https://jerrycoding.com/article/csharp-autoupdate2

微信
支付宝

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论

每日一句 (From ONE)
我觉得,我爱这一切,也许这是因为我没有别的什么可爱,或者,即使世上没有什么真的值得任何心灵所爱,多愁善感的我,却必须爱有所及。我可以滥情于区区一个墨水瓶之微,就像滥情于星空中巨大无边的寂冷。
微信扫码

扫一扫关注我

关于本站